#!/bin/bash

# 参数：Redis IP, 端口, 认证口令, 输出文件路径
REDIS_IP=127.0.0.1
PORT=6379
PASSWORD="foobared"
OUTPUT_FILE='/tmp/redis_get_no_expires_key.txt'

# 函数：用于执行redis-cli命令并处理结果，获取所有永久不过期的键
get_no_expire_keys() {
    local cursor=0
    local keys=()

    while true; do
        # 使用 SCAN 命令迭代数据库
        local result=$(redis-cli -h $REDIS_IP -p $PORT -a "$PASSWORD" --raw SCAN $cursor)

        # 检查是否有错误发生
        if [[ $result == "ERR"* ]]; then
            echo "Error occurred: $result"
            exit 1
        fi

        # 解析 SCAN 命令的结果
        IFS=$'\r\n' read -r -d '\n' new_cursor new_keys_str <<< "$result"
        local new_keys=($new_keys_str)

        # 如果游标不是数字，则退出循环
        if ! [[ $new_cursor =~ ^[0-9]+$ ]]; then
            echo "Invalid cursor value: $new_cursor"
            break
        fi

        for key in "${new_keys[@]}"; do
            # 检查每个key的TTL，如果是-1，则表示永不过期
            ttl_result=$(redis-cli -h $REDIS_IP -p $PORT -a "$PASSWORD" TTL "$key")
            if [ "$ttl_result" == "-1" ]; then
                keys+=("$key")
            fi
        done

        # 更新游标
        cursor=$new_cursor

        # 如果游标回到0，说明遍历完成
        if [ "$cursor" -eq 0 ]; then break; fi
    done

    # 返回找到的所有永不过期的键
    printf "%s\n" "${keys[@]}"
}

# 根据是否有密码选择连接方式
if [ -z "$PASSWORD" ]; then
    # 如果没有密码
    KEYS=$(get_no_expire_keys)
else
    # 如果有密码
    KEYS=$(get_no_expire_keys)
fi

# 清空输出文件
> "$OUTPUT_FILE"

# 将获取到的所有永久不过期的键逐行写入指定文件
echo "$KEYS" >> "$OUTPUT_FILE"

echo "命令执行成功，所有永久不过期的键已写入$OUTPUT_FILE"